/** 控制页面登录权限的文件 */
import router from './router'
import store from './store'
import { Message } from 'element-ui'
import NProgress from 'nprogress' // 进度条插件
import 'nprogress/nprogress.css' // 进度条样式

NProgress.configure({ showSpinner: false }) // 在加载进度条时不显示加载小图标

const whiteList = ['/login', '/404'] // 白名单页面

router.beforeEach(async (to, from, next) => {
    NProgress.start() // 开启进度条
    if(store.getters.token) {
        // 如果存在token
        if(to.path === '/login') {
            // 如果要访问的是登录页
            next('/') // 跳到主页
        } else {
            if(!store.getters.userInfo) {
                // 因为user/getUserInfo是异步函数，所以需要使用await，否则后面的同步代码会先执行
                const { roles } = await store.dispatch('user/getUserInfo')
                const routes = await store.dispatch('permission/filterRoutes', roles.menus)
                router.addRoutes(routes) // 动态添加路由
                // 路由表最后必须加上下面这条匹配规则(路径未匹配成功则跳到404)
                router.addRoutes([{ path: '*', redirect: '/404', hidden: true }]) 
                next(to.path) // 如果使用了addRoutes方法，请使用next(to.path)而不是next()
            } else {
                next() // 放行
            }
        }
    } else {
        // 如果token不存在
        if(whiteList.indexOf(to.path) > -1) {
            // 如果要访问的页面在白名单中
            next()
        } else {
            // 不在白名单中
            next('/login')
        }
    }
    NProgress.done() // 使用next('xx')手动跳转的页面 好像不会经过后置导航守卫里，我们在这里手动关闭进度条
})

// 后置导航守卫
router.afterEach(() => {
  // 关闭进度条
  NProgress.done()
})
